大家好!延續上一篇介紹函式的基本概念,今天要來繼續講函式參數的三種類型啦!它們分別是:可選參數、預設參數和剩餘參數。
還記得我在第五天介紹到的可選屬性嗎?可選參數的定義和可選屬性一樣,都是屬於可以給對象提供值,也能不提供值。但是,可選參數在函式中有規定必須遵守,否則TypeScript會報錯!和可選屬性一樣,可選參數也是用?表達。
//可選參數範例:
function studentInfo(name: string, department?: string) {
if (department) {
console.log(`${name}, ${department}`);
} else {
console.log(`${name}`);
}
}
studentInfo("Judy"); //輸出:Judy
studentInfo("Judy", "法語系"); //輸出:Judy, 法語系
//假設今天我把兩個參數的位置調換,會發生什麼事?
function studentInfo(department?: string, name: string) {
if (department) {
console.log(`${name}, ${department}`);
} else {
console.log(`${name}`);
}
} //因為TS規定必填參數不能放在可選參數後面,TS會因此報錯喔!
//如果沒有賦予可選參數一個值,那他會是甚麼型別呢?
function studentInfo(name: string, department?: string) {
console.log(`${name}`);
}
studentInfo("Judy");
//如果呼叫函式時沒有提供可選參數,該參數的值會是undefined。
//因此在使用它之前,可以透過條件判斷確認是否有傳入值。
預設參數和可選參數一樣,在呼叫函式時可以不提供值,差別在於,預設參數會先設定一個預設值。當呼叫函式時沒有提供這個參數,就會自動使用預設值;如果有提供值,則會使用傳入的值。
//預設參數範例:
function p(price: number, discount: number = 0.5): number{
return price * discount;
}
//假設沒有傳入discount時,會自動套用預設值 0.5
console.log(p(10)); //輸出:10 * 0.5 = 5
//也可以傳入自訂的值來覆蓋預設值
console.log(p(10, 0.1)); //此時輸出會是1
和可選參數不同的是,預設參數可以往前放,如果想跳過預設參數,直接傳入後面的參數,就需要在該位置傳入undefined。
當我們不知道使用者會傳入多少參數時,剩餘參數能幫助函式將傳入的參數統整成一個陣列。須以...寫在參數前方表示。
//剩餘參數範例:
function sum(...numbers: number[]) {
//因為剩餘參數最後會整合成一個陣列,我們需要定一個陣列型別
//用reduce加總陣列裡的參數
const total = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(`${total}`);
}
sum(1, 2, 3); // 輸出: 6
sum(3, 3, 2, 3, 3); // 輸出: 14
//錯誤示範:
sum(1, 4, 6, "Apple") // 因為指定了number作為陣列型別,放入string的資料會導致TS報錯
需要注意的是,剩餘參數永遠只能是函式的最後一個參數,而且一個函式只能有一個剩餘參數喔!
今天介紹了三個常見的函式參數,我覺得很容易搞混的是可選參數和預設參數,剩餘參數反倒沒有和前兩者那麼相像,但是我還是會把三者做成一個表格方便大家參考他們之間的差異!
| 可選參數 | 預設參數 | 剩餘參數 | |
|---|---|---|---|
| 主要用途 | 將參數定義為可傳可不傳 | 不傳值時,直接套用預先寫好的參數 | 接收不固定數量的參數,並整理成一個陣列 |
| 寫法 | 在參數後加上? |
參數 : 型別 = 預設值 |
在參數前加上...,並在後面宣告陣列型別 |
| 位置 | 只能在必填參數後,不能寫在第一個參數的位置 | 可以放在必填參數前面,但跳過時需傳入 undefined |
必須是參數列表的最後一個 |
沒想到不知不覺就寫到第十天了!今天的內容就先到這裡,我們明天見!